<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
    <script>
        //【笔记】filter()也是数组Array.prototype几个重要方法

        //【不改变原有数组，调用返回新数组】//兼容：ie678不支持
        //比喻：就是你每个钱包数过去的时候，里面钱少于100块的不要（留在原来盒子里），大于100块的丢到新盒子里，这样结束的时候就有了一个新数组，里面都是大于100的钱包。

        //filter为“过滤”、“筛选”之意。指数组filter后，返回过滤后的新数组。用法跟map极为相似：

        //filter() 方法使用指定的函数测试所有元素，
        //并创建一个包含所有通过测试的元素的新数组。

        //【语法】：var new_arrary = arr.filter(callback，[thisArg])
        //语法解释：参数为函数，首参为v，二参为i，三参为原数组。四参可以重新指定this值。
        //callback:用来测试数组的每个元素的函数。调用时使用参数 (element, index, array)。 /*ele每一项，index索引，array被遍历的数组*/
        //[, thisArg]：可选。thisArg则是执行 callback 时this指向
        //返回true表示保留该元素（通过测试），false则不保留。

        //返回值：一个新的通过测试的元素的集合的数组【原来数组不会被改变】
        var arr = [1, 11, 22, 23];
        var res = arr.filter(function(v, i, origin) {
            console.log(v);
            console.log(i);
            console.log(origin);
            return i < 2;
        }, _this);
        console.log(arr); //【原数组不会改变】
        console.log(res); //【方法调用后的返回值为新的数组。

        //需求：过滤一组符合法定饮酒年龄的学生年龄。
        // 【本质是过滤出满足一定条件的每个元素，结果以新数组形式呈现】

        //（0）语法：【1】调用主体为数组【2】参数为函数【3】原有数组不会被改变
        const studentsAge = [17, 16, 18, 19, 21, 17];
        const ableToDrink = studentsAge.filter(age => age > 18);
        console.log(ableToDrink); //[19,21]
        //（1）const，常量值，一旦定义，值不能被改变，如果是对象，可以新添加属性，
        // 但是已经添加的，不能被覆盖改变
        //（2）上面功能的es5语法
        var filtered = [17, 16, 18, 19, 21, 17].filter(isBigEnough);

        function isBigEnough(value) {
            return value > 18; //返回值
        };
        console.log(filtered); // filtered is [19,21]
        //上面的函数的箭头函数写法为
        var isBigEnough = value => value > 18

        //【面试题】两个数组取差集（即两个数组，对比去掉重复的，留下不重叠的）
        Array.prototype.diff = function(a) {
            //此处的逻辑相当于diff=function(a){};diff会被挂载于所有实例化数组，调用该方法即执行内部
            //代码，i则为big中的每一项元素，如果在small中找不到，就会被返回。
            return this.filter(function(i) {
                return a.indexOf(i) < 0;
            });
        };
        var big = [1, 2, 3, 4, 5];
        var small = [1, 2];
        var result = big.diff(small);
        console.log(result); //[3, 4, 5]返回值：新的数组，即差集数组
        console.log(big); //[1, 2, 3, 4, 5]//原调用数组不会被改变
        console.log(small); // [1, 2]//被参照数组也没有被改变
    </script>
</body>

</html>